/**
 * @Title: MySharedPreferences.java
 * @Package org.haier.ck.com.util
 * @Description:存储用户信息
 * @author 周建伟
 * @date 2015年10月19日 上午9:08:37
 * @version V1.0
 */
package com.astroway.livetest.util;

import android.content.Context;
import android.content.SharedPreferences;
import android.text.TextUtils;
import android.util.Log;

import com.alibaba.fastjson.JSON;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.StreamCorruptedException;

import static android.provider.Contacts.SettingsColumns.KEY;

public class SharedUtil {

    private SharedPreferences sp;
    private SharedPreferences.Editor editor;
    private SharedPreferences sp_user;
    private SharedPreferences.Editor editor_user;

    // 存储的sharedpreferences文件名
    private final String FILE_NAME = "save_user_message";
    private final String FILE_NAME_USER = "save_user_message_important";

    /**
     * @Description: TODO
     * @author 周建伟
     * @date 2015年10月19日
     */
    public SharedUtil(Context context) {
        sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
        editor = sp.edit();
        sp_user = context.getSharedPreferences(FILE_NAME_USER, Context.MODE_PRIVATE);
        editor_user = sp_user.edit();
    }

    /**
     * @param @param key 存放的key值
     * @param @param data 存放的数据
     * @return void
     * @throws
     * @Description:保存数据到文件
     * @author 周建伟
     * @date 2015年10月19日
     */
    public void saveData(String key, Object data) {
        String type = data.getClass().getSimpleName();

        if ("Integer".equals(type)) {
            editor.putInt(key, (Integer) data);
        } else if ("Boolean".equals(type)) {
            editor.putBoolean(key, (Boolean) data);
        } else if ("String".equals(type)) {
            editor.putString(key, (String) data);
        } else if ("Float".equals(type)) {
            editor.putFloat(key, (Float) data);
        } else if ("Long".equals(type)) {
            editor.putLong(key, (Long) data);
        }

        editor.commit();
    }

    /**
     * @param @param  key 存放数据的key值
     * @param @param  defValue 默认值
     * @param @return
     * @return Object
     * @throws
     * @Description: 从文件中读取数据
     * @author 周建伟
     * @date 2015年10月19日
     */
    public Object getData(String key, Object defValue) {

        String type = defValue.getClass().getSimpleName();

        // defValue为为默认值，如果当前获取不到数据就返回它
        if ("Integer".equals(type)) {
            return sp.getInt(key, (Integer) defValue);
        } else if ("Boolean".equals(type)) {
            return sp.getBoolean(key, (Boolean) defValue);
        } else if ("String".equals(type)) {
            return sp.getString(key, (String) defValue);
        } else if ("Float".equals(type)) {
            return sp.getFloat(key, (Float) defValue);
        } else if ("Long".equals(type)) {
            return sp.getLong(key, (Long) defValue);
        }

        return null;
    }

    /**
     * @param key  存放的key值
     * @param data 存放的数据
     * @date 创建时间: 2016/12/7
     * @author XiaoFeng
     * @Description 存储用户信息的方法，用户相关，注销不清理
     */
    public void saveUserData(String key, Object data) {
        String type = data.getClass().getSimpleName();

        if ("Integer".equals(type)) {
            editor_user.putInt(key, (Integer) data);
        } else if ("Boolean".equals(type)) {
            editor_user.putBoolean(key, (Boolean) data);
        } else if ("String".equals(type)) {
            editor_user.putString(key, (String) data);
        } else if ("Float".equals(type)) {
            editor_user.putFloat(key, (Float) data);
        } else if ("Long".equals(type)) {
            editor_user.putLong(key, (Long) data);
        }

        editor_user.commit();
    }

    /**
     * @param key      存放的key值
     * @param defValue 默认值
     * @return 返回的数据
     * @date 创建时间: 2016/12/7
     * @author XiaoFeng
     * @Description 从文件中读取数据，用户相关，注销不清理
     */
    public Object getUserData(String key, Object defValue) {

        String type = defValue.getClass().getSimpleName();

        // defValue为为默认值，如果当前获取不到数据就返回它
        if ("Integer".equals(type)) {
            return sp_user.getInt(key, (Integer) defValue);
        } else if ("Boolean".equals(type)) {
            return sp_user.getBoolean(key, (Boolean) defValue);
        } else if ("String".equals(type)) {
            return sp_user.getString(key, (String) defValue);
        } else if ("Float".equals(type)) {
            return sp_user.getFloat(key, (Float) defValue);
        } else if ("Long".equals(type)) {
            return sp_user.getLong(key, (Long) defValue);
        }

        return null;
    }

    /**
     * @param key 存储的key值
     * @param obj 要保存的对象，只能保存实现了serializable的对象
     * @date 创建时间: 2017/1/3
     * @author XiaoFeng
     * @Description 保存对象
     */
    public void saveObject(String key, Object obj) {
        try {
            // 先将序列化结果写到byte缓存中，其实就分配一个内存空间
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ObjectOutputStream os = new ObjectOutputStream(bos);
            // 将对象序列化写入byte缓存
            os.writeObject(obj);
            // 将序列化的数据转为16进制保存
            String bytesToHexString = bytesToHexString(bos.toByteArray());
            // 保存该16进制数组
            saveUserData(key, bytesToHexString);
        } catch (IOException e) {
            e.printStackTrace();
            Log.e("", "保存obj失败");
        }
    }

    /**
     * @date 创建时间: 2017/1/3
     * @author XiaoFeng
     * @Description 将数组转为16进制
     */
    public String bytesToHexString(byte[] bArray) {
        if (bArray == null) {
            return null;
        }
        if (bArray.length == 0) {
            return "";
        }
        StringBuffer sb = new StringBuffer(bArray.length);
        String sTemp;
        for (int i = 0; i < bArray.length; i++) {
            sTemp = Integer.toHexString(0xFF & bArray[i]);
            if (sTemp.length() < 2)
                sb.append(0);
            sb.append(sTemp.toUpperCase());
        }
        return sb.toString();
    }

    /**
     * @param key 存储的key值
     * @date 创建时间: 2017/1/3
     * @author XiaoFeng
     * @Description 获取保存的Object对象
     */
    public Object readObject(String key) {
        try {
            if (sp_user.contains(key)) {
                String string = (String) getUserData(key, "");
                if (TextUtils.isEmpty(string)) {
                    return null;
                } else {
                    // 将16进制的数据转为数组，准备反序列化
                    byte[] stringToBytes = StringToBytes(string);
                    ByteArrayInputStream bis = new ByteArrayInputStream(stringToBytes);
                    ObjectInputStream is = new ObjectInputStream(bis);
                    // 返回反序列化得到的对象
                    Object readObject = is.readObject();
                    return readObject;
                }
            }
        } catch (StreamCorruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        // 所有异常返回null
        return null;

    }

    /**
     * @date 创建时间: 2017/1/3
     * @author XiaoFeng
     * @Description 将16进制的数据转为数组
     */
    public byte[] StringToBytes(String data) {
        String hexString = data.toUpperCase().trim();
        if (hexString.length() % 2 != 0) {
            return null;
        }
        byte[] retData = new byte[hexString.length() / 2];
        for (int i = 0; i < hexString.length(); i++) {
            int int_ch;  // 两位16进制数转化后的10进制数
            char hex_char1 = hexString.charAt(i); ////两位16进制数中的第一位(高位*16)
            int int_ch3;
            if (hex_char1 >= '0' && hex_char1 <= '9')
                int_ch3 = (hex_char1 - 48) * 16;   //// 0 的Ascll - 48
            else if (hex_char1 >= 'A' && hex_char1 <= 'F')
                int_ch3 = (hex_char1 - 55) * 16; //// A 的Ascll - 65
            else
                return null;
            i++;
            char hex_char2 = hexString.charAt(i); ///两位16进制数中的第二位(低位)
            int int_ch4;
            if (hex_char2 >= '0' && hex_char2 <= '9')
                int_ch4 = (hex_char2 - 48); //// 0 的Ascll - 48
            else if (hex_char2 >= 'A' && hex_char2 <= 'F')
                int_ch4 = hex_char2 - 55; //// A 的Ascll - 65
            else
                return null;
            int_ch = int_ch3 + int_ch4;
            retData[i / 2] = (byte) int_ch;//将转化后的数放入Byte里
        }
        return retData;
    }

    /**
     * 清空缓存
     */
    public void clearEditor() {
        editor.clear();
        editor.commit();
    }
}
